import json
from langchain_core.prompts import ChatPromptTemplate, PromptTemplate
from langchain.output_parsers import PydanticOutputParser
from large_model.mode_interface.model_interface import ChatInterface
from large_model.case_template.case_template import TestCase
from utils.yaml_utils import read_template_yaml_all, save_test_cases
from utils.yaml_template import case_template
from large_model.prompts_template import api_interfaces

"""
    这里的提示词，是差不多固定的了， 但是这个提示词很废人， 所以要做一个固定的

"""


class Sessions:

    def run_sessions_detail(self):
        chat = ChatInterface().chat_model()

        # 多接口关联，用TestCases
        parser = PydanticOutputParser(pydantic_object=TestCase)

        # 通过手动传入，这个接口的参数，这个相当于是接口文档--暂时的用来当借口文档
        template = read_template_yaml_all('interface_templates.yaml')

        prompt = PromptTemplate(
            # {{}} lanchain 会识别为普通文本
            # template="请你帮我生成三组数据，要求输出纯json格式，不要使用Markdown代码块包裹json，格式要求为{format_instructions}, 文本信息{parser}",
            template=api_interfaces,
            # 定义输入的参数
            input_variables=["template", "parser"],
            # 定义partial_variables
            partial_variables={"format_instructions": parser.get_format_instructions()}
        )

        # 链式输出
        chain = prompt | chat
        result = chain.invoke({
            "template": template,
            "parser": '{},字典格式'
        })

        data_dict = json.loads(result.content)
        test_cases = []
        for data in data_dict:
            print(data)
            test_cases.append(data)
        # 大模型生成测试用例，写入yaml文件
        save_test_cases(test_cases, "session/sessions.yaml")
        # 写入文件后，然后在生成测试文件
        # 把生成测试测试用例，变为.py文件, 测试用例，一定是要以test_开头
        case_template("session/sessions.yaml", "session/test_sessions")
